[IA64] Fix xencomm for xm mem-set command
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 13 Nov 2006 18:24:30 +0000 (11:24 -0700)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 13 Nov 2006 18:24:30 +0000 (11:24 -0700)
This patch saves and restores the hypercall parameter within xencomm.

Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c

index 01842ba34a88c6e1dbfcdd07fd60f115d0379b9b..fda0a45ec52425064d737797074b48f95edd8d0a 100644 (file)
@@ -221,10 +221,17 @@ xencommize_memory_reservation (xen_memory_reservation_t *mop)
 int
 xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
 {
+       XEN_GUEST_HANDLE(xen_pfn_t) extent_start_va[2];
+       xen_memory_reservation_t *xmr = NULL, *xme_in = NULL, *xme_out = NULL;
+       int rc;
+
        switch (cmd) {
        case XENMEM_increase_reservation:
        case XENMEM_decrease_reservation:
        case XENMEM_populate_physmap:
+               xmr = (xen_memory_reservation_t *)arg;
+               xen_guest_handle(extent_start_va[0]) =
+                       xen_guest_handle(xmr->extent_start);
                xencommize_memory_reservation((xen_memory_reservation_t *)arg);
                break;
                
@@ -232,6 +239,12 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
                break;
 
        case XENMEM_exchange:
+               xme_in  = &((xen_memory_exchange_t *)arg)->in;
+               xme_out = &((xen_memory_exchange_t *)arg)->out;
+               xen_guest_handle(extent_start_va[0]) =
+                       xen_guest_handle(xme_in->extent_start);
+               xen_guest_handle(extent_start_va[1]) =
+                       xen_guest_handle(xme_out->extent_start);
                xencommize_memory_reservation
                        (&((xen_memory_exchange_t *)arg)->in);
                xencommize_memory_reservation
@@ -243,8 +256,25 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
                return -ENOSYS;
        }
 
-       return xencomm_arch_hypercall_memory_op
-               (cmd, xencomm_create_inline(arg));
+       rc =  xencomm_arch_hypercall_memory_op(cmd, xencomm_create_inline(arg));
+
+       switch (cmd) {
+       case XENMEM_increase_reservation:
+       case XENMEM_decrease_reservation:
+       case XENMEM_populate_physmap:
+               xen_guest_handle(xmr->extent_start) =
+                       xen_guest_handle(extent_start_va[0]);
+               break;
+
+       case XENMEM_exchange:
+               xen_guest_handle(xme_in->extent_start) =
+                       xen_guest_handle(extent_start_va[0]);
+               xen_guest_handle(xme_out->extent_start) =
+                       xen_guest_handle(extent_start_va[1]);
+               break;
+       }
+
+       return rc;
 }
 
 unsigned long